 /*============================================================================
 //Name        : TP 1 - OPrganizacion del Computador - 1C 2013
 //Author      : Francisco Marin - Barbara Aguilá Cudicio
 //Version     : 1.0
 =============================================================================*/

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <getopt.h>
#include <string.h>
#include <ctype.h>
#include "shellsort.h"
#include "c_sorts.h"
#include "lista.h"

/*********************Auxiliares*********************/

/*Llama a shellsort y ordena apropiadamente, segun el metodo seleccionado.
Opciones:
0_ shellsort de assembler
1_ shellsort de c
2_ bubblesort
*/
void llamar_shellsort(int num_argumentos,char** argumentos,int opcion) {

	FILE* archivo;
	char caracter;
	char* buffer;
	lista* l;
	int i,j;
	l=inicializar_lista();
	l->num_palabras=0;
	buffer=(char*)malloc(sizeof(char)*100);
	j=0;
	for(i=2;i<num_argumentos;i++) {
		archivo=fopen(argumentos[i], "r");
		if (archivo==NULL) {
			printf("El archivo %s no pudo abrirse",argumentos[i]);
			continue;
		}
		while (feof(archivo)==0){
			caracter=fgetc(archivo);
			j=0;
			while (caracter!=' ' && caracter!=-1 && caracter!='\n' && caracter!=','  && caracter!='.') {
				buffer[j]=caracter;
				j++;
				caracter=fgetc(archivo);
			}
			buffer[j]='\0';
			if (strlen(buffer)!=0) {
				buffer[0]=tolower(buffer[0]);
				lista_agregar_palabra(buffer,l);
				buffer=(char*)malloc(sizeof(char)*100);
			}
		}
		free(buffer);
		fclose(archivo);
	}
	if (opcion==1)
		shellsort(obtener_lista(l),obtener_num_elementos(l));
	if (opcion==0)
		shellsort2(obtener_lista(l),obtener_num_elementos(l));
	if (opcion==2)
		bubblesort(obtener_lista(l),obtener_num_elementos(l));
	imprimir_lista(l);
	eliminar_lista(l);
}

/***********************Main************************/

#define MSG_HELP "Usage:\
                                        \n tp0 [OPTIONS][file...]\
                                        \n -h, --help display this help and exit.\
                                        \n -b, --bubble use the bubblesort algorithm.\
                                        \n -s, --sel use the shellsort algorithm.\
                                        \n -t, --sel2 use the shellsort algorithm"


int main(int argc, char** argv)
{
        int c;

        /*Estructura que se pasa por parametro a funcion "getopt_long"*/
        static struct option long_commands[] = {
                        {"help",0,NULL,'h'},
                        {"sel",0,NULL,'s'},
                        {"sel2",0,NULL,'t'},
                        {"bubble",0,NULL,'b'},
        };
        while (((c = getopt_long(argc,argv,"hstb",long_commands,NULL)) != -1)){
                switch (c){
                        case 'h':       printf(MSG_HELP);
                                        return 0;
                                        break;
                        case 's':
					llamar_shellsort(argc,argv,1);
                                        return 0;
                                        break;
                        case 't':       llamar_shellsort(argc,argv,0);
                                        return 0;
                                        break;
			case 'b':       llamar_shellsort(argc,argv,2);
                                        return 0;
                                        break;
                }
        }
}

